package com.itheima;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

/*
1.Collection集合
    1.1数组和集合的区别
        相同点：容器，容纳多个数据
        不同点：数组是长度不可变的。集合可变
               数组能存基本数据类型和引用数据类型
               集合只能存储引用数据类型，存基本数据要存该类型的包装类
    1.2集合体系
        Collection:单列集合顶层接口
            List:接口，元素可重复，有索引，有序（存取顺序一致）
                ArrayList:数组实现的列表
                LinkedList；链表实现的列表
            Set:接口。元素唯一，无索引，无序
                HashSet:
                TreeSet:
        Map:双列集合顶层接口
            HashMap:
            TreeMap:
     1.3概述和使用
        概述：是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
              JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现

        常用方法：add,remove,removeif,clear,contains(是否存在指定元素)，isEmpty(是否为空),size
     1.4迭代器
        遍历:Iterator<E> it = list.iterator();
                while(it.HashNext()判断是否有元素可以被取出){String s = it.next()获取元素，索引移向下一位;System.out.println(s);}
        删除：if(指定的条件){it.remove();}
             通常removeif比较好用：list.removeif(()->{};)
     1.5增强for
        它是JDK5之后出现的,其内部原理是一个Iterator迭代器
        实现Iterable接口的类才可以使用迭代器和增强for
        简化数组和Collection集合的遍历
        格式：for（元素数据类型 变量名：集合/数组名）{自动遍历封装，直接使用变量名}
2.List集合
    2.1概述和特点
        概述:有序集合（存取顺序一致）可以精确控制插入和访问元素，允许重复元素
        特点：存取有序 可以重复 有索引
    2.2方法（应用）
        add,remove,set(int index,E element/修改指定位置元素，返回被修改的元素),get

3.数据结构
    栈
        先进后出
    队列
        先进先出
    数组
        查询快，增删慢
    链表
        增删快，查询慢

4.List集合的实现类
    ArrayList：数组结构，查询快，增删慢
    LinkedList；链表结构，查询慢，增删快
    4.2LinkedList集合的特有功能【应用】
        addFirst(加至开头),addLast(加至末尾同add),getFirst(),getLast(),removeFirst(),removeLast()
 */
public class Collection_review {
    public static void main(String[] args) {
//        ArrayList<String> list = new ArrayList<>();
//        list.add("aaa");
//        list.add("bbb");
//        list.add("ccc");
//        list.add("bbb");
//        list.add("abcd");
        /*Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.println(s);//遍历
            if("bbb".equals(s)){
                it.remove();//迭代器自己的删除
            }
        }
        System.out.println(list);*/
        /*list.removeIf(s -> "bbb".equals(s));
        for (String s : list) {
            System.out.println(s);
        }*/
        //myListAdd(list);
        //myListRemove(list);
        //myListSet(list);
        //myListGet(list);
        /*LinkedList<String> list = new LinkedList<>();
        list.add("aaa");
        list.addFirst("000");
        list.addLast("bbb");
        System.out.println(list.getFirst());
        System.out.println(list.getLast());
        list.removeFirst();
        System.out.println(list);
        list.removeLast();
        System.out.println(list);*/

    }

    private static void myListGet(ArrayList<String> list) {
        //        E get(int index) 返回指定索引处的元素
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

    private static void myListSet(ArrayList<String> list) {
        //        E set(int index,E element) 修改指定索引处的元素，返回被修改的元素
        list.set(3,"dcba");
        System.out.println(list);
    }

    private static void myListRemove(ArrayList<String> list) {
        //        E remove(int index) 删除指定索引处的元素，返回被删除的元素
        list.remove(3);
        System.out.println(list);
    }

    private static void myListAdd(ArrayList<String> list) {
        //        void add(int index,E element) 在此集合中的指定位置插入指定的元素
        list.add(1,"ccc");
        System.out.println(list);
    }
}
